package com.tedu.day02.oop;

/**
 * 抽象类特点<补充>
 *           类：成员变量|成员方法|构造方法
 *           抽象类：成员变量|成员方法|构造方法
 *           创建抽象类----普通类变成（实现）子类---继承抽象类
 *           成员变量：既可以变量，也可以常量
 *           构造方法：有，用于子类访问调用抽象【父】类的成员变量---赋值
 *           构造方法：既可以抽象，非抽象
 *           抽象方法与非抽象方法出现在抽象问题：
 *           A：抽象方法  【重写】强制要求子类完成父类抽象方法
 *           B：非抽象方法 【拓展】子类继承的事情，提高代码复用性
 */
abstract class Foo {
    //成员变量
    public int i = 10;
    public final int j = 20;    //成员变量：常量
    //Java强类型语言：大小写分明
    //public int  j=30;
    //  构造方法


    public Foo() {
        this(30);//调用当前类对象的其他构造器
    }
    public Foo(int i){
        this.i=30;
    }
    //成员方法:抽象方法
    public abstract void show();
    //成员方法：非抽象方法
    public void method(){
        System.out.println("Foo     method");
    }


}

//实现{子}类
class Goo extends Foo{
    public void show() {
        System.out.println("Goo show");
    }
    public void method(){
        System.out.println("Goo  method");
    }
}

public class 抽象补充知识点 {
    public static void main(String[] args) {
        //抽象类----继承----多态类---向上造型
        Foo f=new Goo();
        //①实例化--子类的构造器，默认存在无参构造器
        //再通过super()调用父类无参构造器
        //②执行抽象类无参构造器
        //③this调用的同时，完成对抽象类中 i 进行赋值 i=30
        System.out.println(f.i);  //30


     //   ---------------------------------------------
     f.show();          //输数：Goo   show    重写
     f.method();         //输出：Goo   method   拓展【子类方法重写】
    }
}
/*拓展：abstract关键共存问题*/
abstract class Aoo{
    //private abstract void  show1();冲突
    //public  final abstract void show2();冲突
    //public static abstract void show3();
    // 无意义：静态方法需要加语法快{}，抽象方法
}

